#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 定义图像路径
    std::string image_path = "../Fig0316(3)(third_from_top).tif";  // 图像文件路径

    // 读取图像为灰度图像
    cv::Mat image = cv::imread(image_path, cv::IMREAD_GRAYSCALE);

    // 检查图像是否成功加载
    if (image.empty()) {
        std::cerr << "Error: Unable to load image from " << image_path << std::endl;
        return -1;
    }

    // 定义简单阈值法的参数
    int simple_threshold_value = 127;  // 阈值设置为127
    int max_value = 255;               // 阈值化时大于阈值的像素值设置为255
    int threshold_type = cv::THRESH_BINARY;  // 阈值类型为二值化

    // 应用简单阈值法
    cv::Mat thresh_simple;
    cv::threshold(image, thresh_simple, simple_threshold_value, max_value, threshold_type);

    // 定义自适应阈值法的参数
    int adaptive_max_value = 255;               // 自适应阈值法的最大值
    int adaptive_method = cv::ADAPTIVE_THRESH_MEAN_C;  // 使用局部区域均值来计算阈值
    int adaptive_threshold_type = cv::THRESH_BINARY;     // 阈值类型为二值化
    int block_size = 11;                                 // 块大小，用于局部区域
    int constant = 2;                                    // 常数，从局部均值中减去，调整局部区域均值的结果常数

    // 应用自适应阈值法
    cv::Mat thresh_adaptive;
    cv::adaptiveThreshold(image, thresh_adaptive, adaptive_max_value, adaptive_method, 
                          adaptive_threshold_type, block_size, constant);

    // 定义OTSU阈值法的参数
    int otsu_threshold_value = 0;  // OTSU方法自动选择阈值
    int otsu_threshold_type = cv::THRESH_BINARY | cv::THRESH_OTSU;  // OTSU方法与二值化结合使用

    // 应用OTSU阈值法
    cv::Mat thresh_otsu;
    cv::threshold(image, thresh_otsu, otsu_threshold_value, max_value, otsu_threshold_type);

    // 显示处理结果
    cv::imshow("Original Image", image);               // 显示原图
    cv::imshow("Simple Thresholding", thresh_simple);  // 显示简单阈值化结果
    cv::imshow("Adaptive Thresholding", thresh_adaptive);  // 显示自适应阈值化结果
    cv::imshow("OTSU Thresholding", thresh_otsu);      // 显示OTSU阈值化结果

    // 等待按键事件，按任意键关闭所有窗口
    cv::waitKey(0);
    cv::destroyAllWindows();  // 关闭所有显示的窗口

    return 0;
}
